package com.ken.judge.config;

import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientBuilder;
import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
import com.ken.judge.config.DockerSandBoxPool;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


//这个文件 DockerSandBoxPoolConfig 是一个 Spring Boot 配置类，用于配置和初始化 DockerSandBoxPool 相关的 Bean。
// 它的主要作用是通过读取配置文件中的参数，创建并初始化 DockerSandBoxPool 实例，以便在应用程序中使用 Docker 容器池。

@Configuration
public class DockerSandBoxPoolConfig {

    @Value("${sandbox.docker.host:tcp://localhost:2375}")
    private String dockerHost;

    @Value("${sandbox.docker.image:openjdk:8-jdk-alpine}")
    private String sandboxImage;

    @Value("${sandbox.docker.volume:/usr/share/java}")
    private String volumeDir;

    @Value("${sandbox.limit.memory:100000000}")
    private Long memoryLimit;

    @Value("${sandbox.limit.memory-swap:100000000}")
    private Long memorySwapLimit;

    @Value("${sandbox.limit.cpu:1}")
    private Long cpuLimit;

    @Value("${sandbox.docker.pool.size:4}")
    private int poolSize;

    @Value("${sandbox.docker.name-prefix:oj-sandbox-jdk}")
    private String containerNamePrefix;

    @Bean
    public DockerClient createDockerClient() {
        DefaultDockerClientConfig clientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder()
                .withDockerHost(dockerHost)
                .build();
        return DockerClientBuilder
                .getInstance(clientConfig)
                .withDockerCmdExecFactory(new NettyDockerCmdExecFactory())
                .build();
    }

    @Bean
    public DockerSandBoxPool createDockerSandBoxPool(DockerClient dockerClient) {
        DockerSandBoxPool dockerSandBoxPool = new DockerSandBoxPool(dockerClient, sandboxImage, volumeDir, memoryLimit,
                memorySwapLimit, cpuLimit, poolSize, containerNamePrefix);
        dockerSandBoxPool.initDockerPool();
        return dockerSandBoxPool;
    }
}

/*
        sandbox.docker.host：Docker 守护进程的地址，默认是 tcp://localhost:2375。

        sandbox.docker.image：用于创建容器的 Docker 镜像，默认是 openjdk:8-jdk-alpine。

        sandbox.docker.volume：容器挂载的目录路径，默认是 /usr/share/java。

        sandbox.limit.memory：容器的内存限制，默认是 100000000 字节（约 100MB）。

        sandbox.limit.memory-swap：容器的内存和交换分区限制，默认是 100000000 字节。

        sandbox.limit.cpu：容器的 CPU 限制，默认是 1 个 CPU。

        sandbox.docker.pool.size：容器池的大小，默认是 4 个容器。

        sandbox.docker.name-prefix：容器名称的前缀，默认是 oj-sandbox-jdk。*/
